Ocean adapta data

By species data exploration

  • for each region, year, species combination, the mean location and biomass, shows species averages.

By species data exploration

  • for every region and year, all of the species for that region, including zeros if they were not present.

O.K. so now we have a wtcpue column here. Lets now get some data wrangling going and exploration figures

Survey plots

plot_data <- dat_exploded %>% 
  group_by(spp,year,lat,lon,depth) %>%
  summarise_if(is_numeric,mean,na.rm=T) %>%
  mutate(
    year = as.numeric(year)
  )
DeprecatedDeprecatedDeprecatedDeprecatedDeprecatedDeprecated

Histogram of data points

Timeline of depth and wtcpue

Boxplot of data

Survey maps

us_map <- st_as_sf(map("state", plot = FALSE, fill = TRUE))

path_world <- MyFunctions::my_path("G", extra_path = "Spatial/SAU/SAU_Shapefile")
path_world <- "~/Downloads/SAU_Shapefile"

# The File
fnam_world <- "SAUEEZ_July2015.shp"

# Load it!
World_eez_sf <- st_read(dsn = path_world,
                        layer =file_path_sans_ext(fnam_world)) %>% 
  rename(eez_name = Name) %>% 
  st_transform(crs = 4326) %>% # 4326
  # st_transform(crs = "+proj=eck4") %>% # for tbular plot
  st_simplify(preserveTopology = TRUE, dTolerance = 0.1) %>% 
  filter(eez_name == "USA (East Coast)")

# Set manual breaks for bins
bins <- seq(1970,2020,5)

map_data <- dat_exploded %>% 
  group_by(spp,year,lat,lon,depth) %>%
  summarise_if(is_numeric,mean,na.rm=T) %>%
  mutate(
    year = as.numeric(year),
    period = cut(year, breaks = bins)
  ) %>% 
  group_by(period,lat,lon) %>% 
  summarise_if(is.numeric,mean,na.rm=T) %>% 
  filter(wtcpue>0) 

Map of smapling points

In this case the color gradiant represents year from 1972 to 2019

Density map

This is a simple 2d kenell analysis using ggplot2::stat_density_2d() of the sampling points

Looks to me that the stock might not be shifting per se but expanding its northern range

CPUE (wt CPUE) data

ggplot(us_map) +
  geom_sf() +
  geom_sf(data = World_eez_sf, aes(), fill = "white") +
  geom_point(data = subset(map_data, wtcpue < 100),
             aes(
               x = lon,
               y = lat,
               color = wtcpue
             ),
             
  ) +
  # facet_wrap(~period,
  #            nrow = 2) +
  scale_color_distiller(palette = "Spectral", 
                       guide_legend(title = "CPUE")) + 
  # viridis::scale_fill_viridis() +
  # viridis::scale_colour_viridis() +
  coord_sf(xlim = c(-76, -65),ylim = c(35, 45)) +
  MyFunctions::my_ggtheme_m()
)
Error: unexpected ')' in ")"

ERDDAP

This is the data extracted directly from NOAA in has four available surveys (OceanAdapt only two)

LS0tCnRpdGxlOiAiT2NlYW4gYWRhcHQgZXhwbG9yYXRpb24gc2NyaXB0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpNeUZ1bmN0aW9uczo6bXlfbGliKGMoImdnbWFwIiwic2YiLCJ0aWR5dmVyc2UiLCJ0b29scyIsInJlYWRyIiwiZGF0YS50YWJsZSIsIm1hcHMiKSkKYGBgCgojIE9jZWFuIGFkYXB0YSBkYXRhCgoKYGBge3IgYmFzaWNfZXhwbG9yYXRpbiwgZXZhbCA9IEYsIGVjaG8gPSBGfQoKaGVhZChieV9zcGVjaWVzKQpuYW1lcyhieV9zcGVjaWVzKQp1bmlxdWUoYnlfc3BlY2llcyRzcHApCnVuaXF1ZShieV9zcGVjaWVzJHJlZ2lvbikKbWF4KGJ5X3NwZWNpZXMkeWVhcikKbWluKGJ5X3NwZWNpZXMkeWVhcikKCmBgYAoKCiMjIEJ5IHNwZWNpZXMgZGF0YSBleHBsb3JhdGlvbgoKLSBmb3IgZWFjaCByZWdpb24sIHllYXIsIHNwZWNpZXMgY29tYmluYXRpb24sIHRoZSBtZWFuIGxvY2F0aW9uIGFuZCBiaW9tYXNzLCBzaG93cyBzcGVjaWVzIGF2ZXJhZ2VzLgoKYGBge3IgYnlfc3BlY2llc19kYXRhLCBldmFsID0gVCwgZWNobyA9IFR9CgoKYnlfc3BlY2llcyA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhX2NsZWFuL2J5X3NwZWNpZXMuY3N2IikpCgpoZWFkKGJ5X3NwZWNpZXMpCgpieV9zcGVjaWVzICU+JSAKICBmaWx0ZXIoc3BwID09ICJDZW50cm9wcmlzdGlzIHN0cmlhdGEiLAogICAgICAgICByZWdpb24gJWluJSBjKCJOb3J0aGVhc3QgVVMgRmFsbCIgLCAiTm9ydGhlYXN0IFVTIFNwcmluZyIpCiAgICAgICAgICkKCgpgYGAKCgoKYGBge3IgcGxvdF9ieV9zcGVjaWVzLCBldmFsID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gRn0KCnN1cHByZXNzV2FybmluZ3MoCiAgYnlfc3BlY2llcyAlPiUgCiAgICBmaWx0ZXIoc3BwID09ICJDZW50cm9wcmlzdGlzIHN0cmlhdGEiLAogICAgICAgICAgIHJlZ2lvbiAlaW4lIGMoIk5vcnRoZWFzdCBVUyBGYWxsIiAsICJOb3J0aGVhc3QgVVMgU3ByaW5nIikpICU+JSAKICAgIGdyb3VwX2J5KHNwcCx5ZWFyLGxhdCxsb24sZGVwdGgpICU+JQogICAgc3VtbWFyaXNlX2lmKGlzX251bWVyaWMsbWVhbikgJT4lCiAgICBnZ3Bsb3QoKSArCiAgICBnZW9tX3BvaW50KAogICAgICBhZXMoCiAgICAgICAgeCA9IGxvbiwKICAgICAgICB5ID0gbGF0LAogICAgICAgIGZpbGwgPSBhcy5udW1lcmljKHllYXIpLAogICAgICAgIGNvbCA9IGFzLm51bWVyaWMoeWVhcikKICAgICAgKQogICAgKQopCmBgYAoKCiMjIEJ5IHNwZWNpZXMgZGF0YSBleHBsb3JhdGlvbgoKLSBmb3IgZXZlcnkgcmVnaW9uIGFuZCB5ZWFyLCBhbGwgb2YgdGhlIHNwZWNpZXMgZm9yIHRoYXQgcmVnaW9uLCBpbmNsdWRpbmcgemVyb3MgaWYgdGhleSB3ZXJlIG5vdCBwcmVzZW50LgoKYGBge3IgZGF0X2V4cGxvZGVkLCBldmFsID0gVCwgZWNobyA9IFR9CgpkYXRfZXhwbG9kZWQgPC0gcmVhZFJEUygiL1ZvbHVtZXMvRW50ZXJwcmlzZS9EYXRhL3BpbnNreWxhYi1PY2VhbkFkYXB0LTk2NmFkZjAvZGF0YV9jbGVhbi9kYXRfZXhwbG9kZWQucmRzIikgJT4lIAogIGZpbHRlcihzcHAgPT0gIkNlbnRyb3ByaXN0aXMgc3RyaWF0YSIsCiAgICAgICAgIHJlZ2lvbiAlaW4lIGMoIk5vcnRoZWFzdCBVUyBGYWxsIiAsICJOb3J0aGVhc3QgVVMgU3ByaW5nIikpICNObyBtb3JlIHNlYXNvbnMKCmhlYWQoZGF0X2V4cGxvZGVkKQoKCgpgYGAKCk8uSy4gc28gbm93IHdlIGhhdmUgYSBgd3RjcHVlYCBjb2x1bW4gaGVyZS4gTGV0cyBub3cgZ2V0IHNvbWUgZGF0YSB3cmFuZ2xpbmcgZ29pbmcgYW5kIGV4cGxvcmF0aW9uIGZpZ3VyZXMKCiMjIyBTdXJ2ZXkgcGxvdHMKCmBgYHtyIHBsb3RfZGF0YSwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgpwbG90X2RhdGEgPC0gZGF0X2V4cGxvZGVkICU+JSAKICBncm91cF9ieShzcHAseWVhcixsYXQsbG9uLGRlcHRoKSAlPiUKICBzdW1tYXJpc2VfaWYoaXNfbnVtZXJpYyxtZWFuLG5hLnJtPVQpICU+JQogIG11dGF0ZSgKICAgIHllYXIgPSBhcy5udW1lcmljKHllYXIpCiAgKQoKYGBgCgojIyMjIEhpc3RvZ3JhbSBvZiBkYXRhIHBvaW50cwoKYGBge3IgaGlzdG9ncmFtLCBldmFsID0gVCwgZWNobyA9IFR9CgpwbG90X2RhdGEgJT4lIAogIGZpbHRlcih3dGNwdWUgPCAxMCwKICAgICAgICAgd3RjcHVlID4wKSAlPiUgI3JlbW92ZSBUSEFUIG9uZSBvdXRsaWVyCiAgbXV0YXRlKGRlcHRoID0gZGVwdGgqLTEpICU+JSAKICBnYXRoZXIoInZhcmlhYmxlIiwidmFsdWUiLGRlcHRoOnd0Y3B1ZSkgJT4lIAogICMgVmlldyguKQogICAgZ2dwbG90KCkgKwogICAgZ2VvbV9oaXN0b2dyYW0oCiAgICAgIGFlcygKICAgICAgICB4ID0gdmFsdWUsCiAgICAgICksCiAgICAgIGJpbndpZHRoID0gMQogICAgKSArCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUsCiAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giKQoKYGBgCgojIyMjIFRpbWVsaW5lIG9mIGRlcHRoIGFuZCB3dGNwdWUKCmBgYHtyIHRpbWVsaW5lLCBldmFsID0gVCwgZWNobyA9IFR9CgpwbG90X2RhdGEgJT4lIAogICMgZmlsdGVyKHd0Y3B1ZSA8IDIwMCkgJT4lICNyZW1vdmUgVEhBVCBvbmUgb3V0bGllcgogIG11dGF0ZShkZXB0aCA9IGRlcHRoKi0xKSAlPiUKICBnYXRoZXIoInZhcmlhYmxlIiwidmFsdWUiLGRlcHRoOnd0Y3B1ZSkgJT4lIAogIG11dGF0ZShsYXRfcm91bmQgPSByb3VuZChsYXQpKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUseWVhcixsYXRfcm91bmQpICU+JSAKICBzdW1tYXJpc2VfYXQodmFycyh2YWx1ZSksc3VtKSAlPiUgCiAgIyBWaWV3KC4pCiAgICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoCiAgICAgIGFlcygKICAgICAgICB4ID0geWVhciwKICAgICAgICB5ID0gdmFsdWUsCiAgICAgICAgY29sID0gYXMuZmFjdG9yKGxhdF9yb3VuZCkKICAgICAgKQogICAgKSArCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUsCiAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgTXlGdW5jdGlvbnM6Om15X2dndGhlbWVfcCgpCgoKCmBgYAoKIyMjIyBCb3hwbG90IG9mIGRhdGEgCgpgYGB7ciBib3hwbG90LCBldmFsID0gVCwgZWNobyA9IFR9CgpwbG90X2RhdGEgJT4lIAogICMgZmlsdGVyKHd0Y3B1ZSA8IDIwMCkgJT4lICNyZW1vdmUgVEhBVCBvbmUgb3V0bGllcgogIG11dGF0ZShkZXB0aCA9IGRlcHRoKi0xKSAlPiUKICBnYXRoZXIoInZhcmlhYmxlIiwidmFsdWUiLGRlcHRoOnd0Y3B1ZSkgJT4lIAogIG11dGF0ZShsYXRfcm91bmQgPSByb3VuZChsYXQpKSAlPiUgCiAgICBnZ3Bsb3QoKSArCiAgICBnZW9tX2JveHBsb3QoCiAgICAgIGFlcygKICAgICAgICB4ID0gYXMuZmFjdG9yKGxhdF9yb3VuZCksCiAgICAgICAgeSA9IHZhbHVlCiAgICAgICAgIyBmaWxsID0gYXMuZmFjdG9yKHllYXIpCiAgICAgICkKICAgICkgKwogIGZhY2V0X3dyYXAofnZhcmlhYmxlLAogICAgICAgICAgICAgIyBuY29sID0gMiwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIikKCgoKYGBgCgoKCmBgYHtyIHRpbWVfbGluZV9mYWNldCwgZXZhbCA9IFQsIGVjaG8gPSBUfQoKIyBTZXQgbWFudWFsIGJyZWFrcyBmb3IgYmlucwpiaW5zIDwtIHNlcSgxOTcwLDIwMjAsMTApCgoKcGxvdF9kYXRhICU+JSAKICAjIGZpbHRlcih3dGNwdWUgPCAyMDApICU+JSAjcmVtb3ZlIFRIQVQgb25lIG91dGxpZXIKICBtdXRhdGUoZGVwdGggPSBkZXB0aCotMSkgJT4lCiAgZ2F0aGVyKCJ2YXJpYWJsZSIsInZhbHVlIixkZXB0aDp3dGNwdWUpICU+JSAKICBtdXRhdGUobGF0X3JvdW5kID0gcm91bmQobGF0KSwKICAgICAgICAgcGVyaW9kID0gY3V0KHllYXIsIGJyZWFrcyA9IGJpbnMpKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUseWVhcixwZXJpb2QsbGF0X3JvdW5kKSAlPiUgCiAgc3VtbWFyaXNlX2F0KHZhcnModmFsdWUpLHN1bSxuYS5ybT1UKSAlPiUgCiAgIyBWaWV3KC4pCiAgICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoCiAgICAgIGFlcygKICAgICAgICB4ID0geWVhciwKICAgICAgICB5ID0gdmFsdWUjLAogICAgICAgICMgY29sID0gLAogICAgICAgICMgZmlsbCA9IGFzLmZhY3Rvcih5ZWFyKQogICAgICApCiAgICApICsKICBmYWNldF93cmFwKH52YXJpYWJsZStsYXRfcm91bmQsCiAgICAgICAgICAgICAjIG5jb2wgPSAyLAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeSIpCgoKZ2MoKQpgYGAKCgojIyMgU3VydmV5IG1hcHMKCmBgYHtyIG1hcHNfc2YsIGV2YWwgPSBGLCBlY2hvID0gVCwgcmVzdWx0cyA9ICdoaWRlJ30KCnVzX21hcCA8LSBzdF9hc19zZihtYXAoInN0YXRlIiwgcGxvdCA9IEZBTFNFLCBmaWxsID0gVFJVRSkpCgpwYXRoX3dvcmxkIDwtIE15RnVuY3Rpb25zOjpteV9wYXRoKCJHIiwgZXh0cmFfcGF0aCA9ICJTcGF0aWFsL1NBVS9TQVVfU2hhcGVmaWxlIikKcGF0aF93b3JsZCA8LSAifi9Eb3dubG9hZHMvU0FVX1NoYXBlZmlsZSIKCiMgVGhlIEZpbGUKZm5hbV93b3JsZCA8LSAiU0FVRUVaX0p1bHkyMDE1LnNocCIKCiMgTG9hZCBpdCEKV29ybGRfZWV6X3NmIDwtIHN0X3JlYWQoZHNuID0gcGF0aF93b3JsZCwKICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPWZpbGVfcGF0aF9zYW5zX2V4dChmbmFtX3dvcmxkKSkgJT4lIAogIHJlbmFtZShlZXpfbmFtZSA9IE5hbWUpICU+JSAKICBzdF90cmFuc2Zvcm0oY3JzID0gNDMyNikgJT4lICMgNDMyNgogICMgc3RfdHJhbnNmb3JtKGNycyA9ICIrcHJvaj1lY2s0IikgJT4lICMgZm9yIHRidWxhciBwbG90CiAgc3Rfc2ltcGxpZnkocHJlc2VydmVUb3BvbG9neSA9IFRSVUUsIGRUb2xlcmFuY2UgPSAwLjEpICU+JSAKICBmaWx0ZXIoZWV6X25hbWUgPT0gIlVTQSAoRWFzdCBDb2FzdCkiKQoKYGBgCgpgYGB7ciBtYXBfZGF0YSwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgojIFNldCBtYW51YWwgYnJlYWtzIGZvciBiaW5zCmJpbnMgPC0gc2VxKDE5NzAsMjAyMCw1KQoKbWFwX2RhdGEgPC0gZGF0X2V4cGxvZGVkICU+JSAKICBncm91cF9ieShzcHAseWVhcixsYXQsbG9uLGRlcHRoKSAlPiUKICBzdW1tYXJpc2VfaWYoaXNfbnVtZXJpYyxtZWFuLG5hLnJtPVQpICU+JQogIG11dGF0ZSgKICAgIHllYXIgPSBhcy5udW1lcmljKHllYXIpLAogICAgcGVyaW9kID0gY3V0KHllYXIsIGJyZWFrcyA9IGJpbnMpCiAgKSAlPiUgCiAgZ3JvdXBfYnkocGVyaW9kLGxhdCxsb24pICU+JSAKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYyxtZWFuLG5hLnJtPVQpICU+JSAKICBmaWx0ZXIod3RjcHVlPjApIAoKYGBgCgojIyMjIE1hcCBvZiBzbWFwbGluZyBwb2ludHMKCkluIHRoaXMgY2FzZSB0aGUgY29sb3IgZ3JhZGlhbnQgcmVwcmVzZW50cyB5ZWFyIGZyb20gMTk3MiB0byAyMDE5CgpgYGB7ciBzdXJ2ZXlfbWFwLCBldmFsID0gVCwgZWNobyA9IFQsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KCmdncGxvdCh1c19tYXApICsKICBnZW9tX3NmKCkgKwogIGdlb21fc2YoZGF0YSA9IFdvcmxkX2Vlel9zZiwgYWVzKCksIGZpbGwgPSAid2hpdGUiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gbWFwX2RhdGEsCiAgICAgICAgICAgICBhZXMoCiAgICAgICAgICAgICAgIHggPSBsb24sCiAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgIGNvbG9yID0geWVhcgogICAgICAgICAgICAgKSwKICAgICAgICAgICAgIHNpemUgPSAxCiAgKSArCiAgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZV9sZWdlbmQodGl0bGUgPSAiUHJvYmFiaWxpdHkgXG5kZW5zaXR5IikpICsgCiAgY29vcmRfc2YoeGxpbSA9IGMoLTc2LCAtNjUpLHlsaW0gPSBjKDM1LCA0NSkpICsKICBNeUZ1bmN0aW9uczo6bXlfZ2d0aGVtZV9tKCkKCmBgYAoKIyMjIERlbnNpdHkgbWFwCgpUaGlzIGlzIGEgc2ltcGxlIDJkIGtlbmVsbCBhbmFseXNpcyB1c2luZyBgZ2dwbG90Mjo6c3RhdF9kZW5zaXR5XzJkKClgIG9mIHRoZSBzYW1wbGluZyBwb2ludHMKCkxvb2tzIHRvIG1lIHRoYXQgdGhlIHN0b2NrIG1pZ2h0IG5vdCBiZSBzaGlmdGluZyBfcGVyIHNlXyBidXQgZXhwYW5kaW5nIGl0cyBub3J0aGVybiByYW5nZQoKYGBge3IgZGVuc2l0eV9tYXAsIGV2YWwgPSBULCBlY2hvID0gVCwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKIyBFeHBhbnNpb24gb2YgdGhlIHN0b2NrCmdncGxvdCh1c19tYXApICsKICBnZW9tX3NmKCkgKwogIGdlb21fc2YoZGF0YSA9IFdvcmxkX2Vlel9zZiwgYWVzKCksIGZpbGwgPSAid2hpdGUiKSArCiAgc3RhdF9kZW5zaXR5XzJkKGRhdGEgPSBtYXBfZGF0YSwgZ2VvbSA9ICJwb2x5Z29uIiwgCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uLCB5ID0gbGF0LCBmaWxsID0gLi5sZXZlbC4uKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBtYXBfZGF0YSwKICAgICAgICAgICAgIGFlcygKICAgICAgICAgICAgICAgeCA9IGxvbiwKICAgICAgICAgICAgICAgeSA9IGxhdAogICAgICAgICAgICAgKSwKICAgICAgICAgICAgIHNpemUgPSAwLjEKICApICsKICBmYWNldF93cmFwKH5wZXJpb2QsCiAgICAgICAgICAgICBucm93ID0gMikgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZV9sZWdlbmQodGl0bGUgPSAiUHJvYmFiaWxpdHkgXG5kZW5zaXR5IikpICsgCiAgIyB2aXJpZGlzOjpzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgIyB2aXJpZGlzOjpzY2FsZV9jb2xvdXJfdmlyaWRpcygpICsKICBjb29yZF9zZih4bGltID0gYygtNzYsIC02NSkseWxpbSA9IGMoMzUsIDQ1KSkgKwogIE15RnVuY3Rpb25zOjpteV9nZ3RoZW1lX20oKQoKYGBgCgojIyMgQ1BVRSAod3QgQ1BVRSkgZGF0YQoKYGBge3IgYmlvbWFzc190aW1lX21hcCwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgpnZ3Bsb3QodXNfbWFwKSArCiAgZ2VvbV9zZigpICsKICBnZW9tX3NmKGRhdGEgPSBXb3JsZF9lZXpfc2YsIGFlcygpLCBmaWxsID0gIndoaXRlIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChtYXBfZGF0YSwgd3RjcHVlIDwgMTAwKSwKICAgICAgICAgICAgIGFlcygKICAgICAgICAgICAgICAgeCA9IGxvbiwKICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgY29sb3IgPSB3dGNwdWUKICAgICAgICAgICAgICksCiAgICAgICAgICAgICAKICApICsKICAjIGZhY2V0X3dyYXAofnBlcmlvZCwKICAjICAgICAgICAgICAgbnJvdyA9IDIpICsKICBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIsIAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJDUFVFIikpICsgCiAgIyB2aXJpZGlzOjpzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgIyB2aXJpZGlzOjpzY2FsZV9jb2xvdXJfdmlyaWRpcygpICsKICBjb29yZF9zZih4bGltID0gYygtNzYsIC02NSkseWxpbSA9IGMoMzUsIDQ1KSkgKwogIE15RnVuY3Rpb25zOjpteV9nZ3RoZW1lX20oKQoKYGBgCgoKIyBFUkREQVAKClRoaXMgaXMgdGhlIGRhdGEgZXh0cmFjdGVkIGRpcmVjdGx5IGZyb20gTk9BQSBpbiBoYXMgZm91ciBhdmFpbGFibGUgc3VydmV5cyAoT2NlYW5BZGFwdCBvbmx5IHR3bykKCi0gTm9ydGhlYXN0IEZpc2hlcmllcyBTY2llbmNlIENlbnRlciAoTkVGU0MpIEZhbGwgQm90dG9tIFRyYXdsIFN1cnZleQkKLSBOb3J0aGVhc3QgRmlzaGVyaWVzIFNjaWVuY2UgQ2VudGVyIChORUZTQykgU3ByaW5nIEJvdHRvbSBUcmF3bCBTdXJ2ZXkJCi0gTm9ydGhlYXN0IEZpc2hlcmllcyBTY2llbmNlIENlbnRlciAoTkVGU0MpIFN1bW1lciBCb3R0b20gVHJhd2wgU3VydmV5CQotIE5vcnRoZWFzdCBGaXNoZXJpZXMgU2NpZW5jZSBDZW50ZXIgKE5FRlNDKSBXaW50ZXIgQm90dG9tIFRyYXdsIFN1cnZleQkKCgotIEJsYWNrIHNlYWJhc3MgY29kZSBpcyAxNDEK